package com.irssproject.app.dao.lectorRSS.impl;

import java.util.Date;
import java.util.Iterator;
import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.irssproject.app.bean.lectorRSS.Etiqueta;
import com.irssproject.app.bean.lectorRSS.Feed;
import com.irssproject.app.bean.lectorRSS.Item;
import com.irssproject.app.bean.lectorRSS.Lectura;
import com.irssproject.app.bean.lectorRSS.Subscripcio;
import com.irssproject.app.bean.main.Usuari;
import com.irssproject.app.dao.lectorRSS.iface.SubscripcioDAO;

public class SubscripcioDAOHibernate extends HibernateDaoSupport implements SubscripcioDAO {


	public List<Subscripcio> getListSubscripcions(Usuari usuari) 
	{
		List<Subscripcio> llistaSubscripcions = (List<Subscripcio>) getHibernateTemplate().find("from Subscripcio subsc where subsc.usuari = ? order by subsc.etiqueta asc", usuari);

		return llistaSubscripcions;
		
	}

	public void insertSubscripcio(Subscripcio subscripcio) 
	{
		getHibernateTemplate().save(subscripcio);
	}

	public void deleteSubscripcio(Long idSubscripcio) 
	{
		Subscripcio subscripcio = (Subscripcio)getHibernateTemplate().get(Subscripcio.class, idSubscripcio);
		getHibernateTemplate().delete(subscripcio);	
	}

	public List<Lectura> getLecturesNoLlegides(Subscripcio subscripcio) 
	{
		getHibernateTemplate().initialize(subscripcio.getLectures());
		
		List<Lectura> li = subscripcio.getLectures();
		
		Iterator it = li.iterator();
		Lectura lectura;
		while(it.hasNext())
		{
			lectura = (Lectura)it.next();
			getHibernateTemplate().initialize(lectura.getItem());
//			Item item = lectura.getItem();
//			getHibernateTemplate().initialize(item.getLectures());

		}
		return subscripcio.getLectures();
	}
	
	public List<Lectura> getTotesLectures(Subscripcio subscripcio) 
	{
		getHibernateTemplate().initialize(subscripcio.getLectures());
		
		List<Lectura> li = subscripcio.getLectures();
		
		Iterator it = li.iterator();
		Lectura lectura;
		while(it.hasNext())
		{
			lectura = (Lectura)it.next();
			getHibernateTemplate().initialize(lectura.getItem());
//			Item item = lectura.getItem();
//			getHibernateTemplate().initialize(item.getLectures());
		}
		return subscripcio.getLectures();
	}
	
	public List<Lectura> obtenirLecturesSubscripcio(Subscripcio subscripcio) 
	{
		getHibernateTemplate().initialize(subscripcio.getLectures());
		
		List<Lectura> li = subscripcio.getLectures();
		
		Iterator it = li.iterator();
		Lectura lectura;
		while(it.hasNext())
		{
			lectura = (Lectura)it.next();
			getHibernateTemplate().initialize(lectura.getItem());
//			Item item = lectura.getItem();
//			getHibernateTemplate().initialize(item.getLectures());
		}
		return subscripcio.getLectures();
	}
	
	public void marcarLecturaLlegida(Lectura lectura) 
	{
		getHibernateTemplate().update(lectura);
	}


	public List<Lectura> getLecturesVotades(Usuari usuari) {

		return (List<Lectura>)getHibernateTemplate().find("from Lectura lectura where lectura.subscripcio.usuari = ? and lectura.valorada = ?", new Object[]{usuari,true});
	}

	public Date getDataDarrerItem(Subscripcio subscripcio) {
		return (Date)getHibernateTemplate().find("select max(data_subscripcio) from Subscripcio subs");
	}

	public List<Subscripcio> getListSubscripcionsPerEtiqueta(Usuari usuari,Etiqueta etiq) {
		return (List<Subscripcio>)getHibernateTemplate().find("from Subscripcio subscripcio where subscripcio.etiqueta = ?", etiq);
	}

	public Item getItem(Item item) {
		return (Item)getHibernateTemplate().findByExample(item).get(0);
	}

	public void definirRellevanciaDeLectura(Lectura lectura) {
		getHibernateTemplate().saveOrUpdate(lectura);
	}

	public Integer getNumItemsSubscripcio(Subscripcio subscripcio) {
		return (Integer)getHibernateTemplate().find("from Item it where it.subscripcio = ?", subscripcio).size();
	}


	public List<Etiqueta> getListEtiquetes(Usuari usuari) {
		return (List<Etiqueta>)getHibernateTemplate().loadAll(Etiqueta.class);
	}

	public Subscripcio getSubscripcioByFeedLink(Usuari usuari, String feedLink) {
		return (Subscripcio)getHibernateTemplate().find("from Subscripcio s where s.feed.link = ? and s.usuari = ?", new Object[]{feedLink, usuari}).get(0);
	}

	public boolean usuariTeFeedSubscrit(Usuari usuari, Feed feed) {
		List<Subscripcio> s = (List<Subscripcio>)getHibernateTemplate().find("from Subscripcio s where s.feed.link = ? and s.usuari = ?", new Object[]{feed.getLink(),usuari});
		if (s.size()>0) return true;
		else return false;
	}

	public Subscripcio getSubscripcioById(Long idSubscripcio) {
		Subscripcio sub = (Subscripcio)getHibernateTemplate().get(Subscripcio.class, idSubscripcio);
		return sub;
	}

	public void refreshSubscripcio(Subscripcio subscripcio) {

		getHibernateTemplate().saveOrUpdate(subscripcio);
		
	}

	public Lectura getLecturaById(Long idLectura) {
		return (Lectura)getHibernateTemplate().get(Lectura.class, idLectura);
	}

	
	public void insertItems(List<Item> items) {
		getHibernateTemplate().saveOrUpdateAll(items);
		
	}

	public Item getItemByLink(String link) {
		List<Item> listItem = (List<Item>)getHibernateTemplate().find("from Item item where item.link = ?", link);
		
		if (listItem.size()>0)
		{
			return listItem.get(0);
		}
		else return null;
	}

	public Long insertItem(Item item) {
		return (Long)getHibernateTemplate().save(item);
	}

	public Date getDarreraDataPublicacio(Subscripcio subscripcio) {
		
		return (Date)getHibernateTemplate().find("select max(item.dataPublicacio) from Item item join item.lectures lectura where lectura.subscripcio = ?", subscripcio).get(0);
	}

	public boolean marcarLlegidaONoLlegida(Long idLectura) {
		Lectura lectura = (Lectura)getHibernateTemplate().get(Lectura.class, idLectura);
		lectura.setLlegida(!lectura.isLlegida());
		getHibernateTemplate().update(lectura);
		return !lectura.isLlegida();
	}

	public boolean valorarLectura(Long idLectura) {
		Lectura lectura = (Lectura)getHibernateTemplate().get(Lectura.class, idLectura);
		lectura.setValorada(!lectura.isValorada());
		getHibernateTemplate().update(lectura);
		return !lectura.isValorada();

	}

	public void marcarTotesLecturesLlegides(Long idSubscripcio) {
	
		Subscripcio sub = (Subscripcio)getHibernateTemplate().get(Subscripcio.class, idSubscripcio);

		Iterator<Lectura> it = sub.getLectures().iterator();
		while(it.hasNext())
		{
			it.next().setLlegida(true);
		}
		getHibernateTemplate().update(sub);
	}

	public List<Lectura> getLecturesBySubscripcioId(Long idSubscripcio) {
		return (List<Lectura>)getHibernateTemplate().find("from Lectura lectura where lectura.subscripcio.id = ?", idSubscripcio);
	}

}
